﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
//using CREAPA.Aplicacao;
using CREAPA.Dominio;
using CREAPA.UL.Web.Models;
using CREAPA.RepositorioADO;
using System.Web.Security;
using System.Security.Principal;
using System.Net.Mail;
using System.IO;
using System.Data.SqlClient;
using Npgsql;

namespace CREAPA.UL.Web.Controllers
{
    public class OSController : Controller
    {
        private siscreaEntitiesBD db = new siscreaEntitiesBD();
        OSRepositorioADO osADO = new OSRepositorioADO();
        SituacaoOsRepositorioADO sitosADO = new SituacaoOsRepositorioADO();
        AnexoRepositorioADO anexoADO = new AnexoRepositorioADO();
        RelatorioRepositorioADO relADO = new RelatorioRepositorioADO();
        string filename = "";

        //private OsAplicacao appOs;
        //public OSController()
        //{
        //    appOs = OsAplicacaoConstrutor.OsAplicacaoADO();
        //}

        [Authorize]
        public ActionResult Index()
        {
            string usu = User.Identity.Name;
            var ListaDeOs = osADO.ListarPorFuncionarioPend(usu);
            return View(ListaDeOs);
        }

        [Authorize]
        public ActionResult Cadastrar()
        {
            if ((DateTime.Now.Hour > 7) && (DateTime.Now.Hour < 17))//Bloqueia fazer OS fora do horário do expediente
            {
                var model = new OS();
                //TempData["data_inicial"] = DateTime.Now;
                int qtde_os_pend_encerra = db.OS.Where(p => p.Analisada == true && p.Encerrada == false && p.PessoaInteressado == User.Identity.Name).Count();

                if (qtde_os_pend_encerra == 0)
                {
                    ViewBag.GrupoProblema = GetGrupoProblemas;
                    //ViewBag.Problema = new SelectList(db.Problemas.Where(p => p.Ativo == true).OrderBy(p => p.Descricao), "Id", "Descricao");
                    ViewBag.Setor = new SelectList(db.Setors.Where(p => p.PermiteOS == true).OrderBy(p => p.Nome), "Id", "Nome", 65);//65 NTI
                    ViewBag.PessoaInteressado = new SelectList(db.Funcionarios.Join(db.Pessoas,
                                 p => p.Pessoa.Id, c => c.Id,
                                 (p, c) => new { p.Login, c.Ativo }).Where(m => (m.Ativo == true)), "Login", "Login", User.Identity.Name);

                    return View(model);
                }
                else
                {
                    TempData["notice"] = "Não é possível Cadastrar uma nova OS enquanto não encerrar as que já foram analisadas";
                    return RedirectToAction("Erro");
                }
            }
            else
            {
                TempData["notice"] = "Não é possível Cadastrar OS fora do horario do expediente";
                return RedirectToAction("Erro");
            }
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Cadastrar(OS os)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    string usu = User.Identity.Name;
                    os.PessoaCadastrou = usu;
                    if (os.PessoaInteressado == null) os.PessoaInteressado = usu;
                    os.DataCadOs = DateTime.Now;

                    if (Request.Files["FileUpload1"].FileName != "")//Algum arquivo foi anexado
                    {
                        foreach (string upload in Request.Files)
                        {
                            if (Request.Files[upload].ContentLength == 0) continue;
                            string pathToSave = Server.MapPath("~/Views/Documentos/OS/");
                            filename = DateTime.Now.Date.ToString().Replace("/", "").Replace(":", "").Replace(" ", "") + "-" + Path.GetFileName(Request.Files[upload].FileName);
                            Request.Files[upload].SaveAs(Path.Combine(pathToSave, filename));
                        }

                        os.Anexo.PessoaCadastrou = usu;
                        os.Anexo.Caminho = "OS\\" + filename;
                    }

                    //TimeSpan diferenca;
                    //DateTime data_ini = (DateTime)TempData["data_inicial"];

                    //diferenca = DateTime.Now - data_ini;

                    osADO.Salvar(os);
                    EnviarEmailOS(os, 1);
                    TempData["CadastrarOS"] = "OS Gravada com sucesso";
                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    ViewBag.GrupoProblema = GetGrupoProblemas;
                    //ViewBag.Problema = new SelectList(db.Problemas.Where(p => p.Ativo == true).OrderBy(p => p.Descricao), "Id", "Descricao");
                    ViewBag.Setor = new SelectList(db.Setors.Where(p => p.PermiteOS == true).OrderBy(p => p.Nome), "Id", "Nome", 1);
                    ViewBag.PessoaInteressado = new SelectList(db.Funcionarios, "Login", "Login", User.Identity.Name);
                    TempData["notice"] = ex;
                    ModelState.AddModelError("", "Não foi possível gravar as alterações, tente novamente mais tarde, se o problema persistir, contate o administrador do sistema. \n<br/>Erro: " + ex.Message);
                }
            }
            else
            {
                //Recarrega o ViewBag
                ViewBag.GrupoProblema = GetGrupoProblemas;
                //ViewBag.Problema = new SelectList(db.Problemas.Where(p => p.Ativo == true).OrderBy(p => p.Descricao), "Id", "Descricao");
                ViewBag.Setor = new SelectList(db.Setors.Where(p => p.PermiteOS == true), "Id", "Nome", 1);
                ViewBag.PessoaInteressado = new SelectList(db.Funcionarios.Join(db.Pessoas,
                                 p => p.Pessoa.Id, c => c.Id,
                                 (p, c) => new { p.Login, c.Ativo }).Where(m => (m.Ativo == true)), "Login", "Login", User.Identity.Name);
            }
            return View(os);
        }

        //Classe Utilizada Para Retornar os GrupoProblema
        public IEnumerable<SelectListItem> GetGrupoProblemas
        {
            get
            {
                IList<CREAPA.UL.Web.Models.GrupoProblema> grupoProblemas = db.GrupoProblemas.OrderBy(x => x.Descricao).ToList();

                IEnumerable<SelectListItem> selectList =
                    from c in grupoProblemas
                    select new SelectListItem
                    {
                        Text = c.Descricao,
                        Value = c.Id.ToString()
                    };
                return selectList;
            }

        }

        //Classe Utilizada Para Filtrar o Problema com Base no GrupoProblema
        public ActionResult GetProblemas(int grupo)
        {
            IList<CREAPA.UL.Web.Models.Problema> problemas = db.Problemas.Where(x => x.GrupoProblema == grupo && x.Ativo == true).OrderBy(x => x.Descricao).ToList();

            IEnumerable<SelectListItem> selectList =
                from x in problemas
                select new SelectListItem
                {
                    //Selected = (c.Id == invoice.CustomerID),
                    Text = x.Descricao,
                    Value = x.Id.ToString()
                };

            return Json(selectList,
                    JsonRequestBehavior.AllowGet
                );
        }

        [Authorize]
        public ActionResult RegistrarAtendimento()
        {
            if ((DateTime.Now.Hour > 7) && (DateTime.Now.Hour < 17))//Bloqueia Registrar Atendimento fora do horário do expediente
            {
                ViewBag.GrupoProblema = GetGrupoProblemas;
                ViewBag.Setor = new SelectList(db.Setors.Where(p => p.PermiteOS == true).OrderBy(p => p.Nome), "Id", "Nome");
                //ViewBag.Problema = new SelectList(db.Problemas.Where(p => p.Ativo == true).OrderBy(p => p.Descricao), "Id", "Descricao");
                ViewBag.OrigemOS = new SelectList(db.Origem_Os, "Id", "Descricao", 6);
                ViewBag.PessoaInteressado = new SelectList(db.Funcionarios.Join(db.Pessoas,
                                     p => p.Pessoa.Id, c => c.Id,
                                     (p, c) => new { p.Login, c.Ativo }).Where(m => (m.Ativo == true)), "Login", "Login", User.Identity.Name);

                return View();
            }
            else
            {
                TempData["notice"] = "Não é possível Registrar Atendimento fora do horario do expediente";
                return RedirectToAction("Erro");
            }

        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult RegistrarAtendimento(OS os)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    string usu = User.Identity.Name;
                    os.PessoaCadastrou = usu;
                    if (os.PessoaInteressado == null) os.PessoaCadastrou = usu;
                    os.DataCadOs = DateTime.Now;
                    if (os.Setor != null && os.Analisada == false && os.Encerrada == false)
                    {
                        if (Request.Files["FileUpload1"].FileName != "")//Algum arquivo foi anexado
                        {
                            foreach (string upload in Request.Files)
                            {
                                if (Request.Files[upload].ContentLength == 0) continue;
                                string pathToSave = Server.MapPath("~/Views/Documentos/OS/");
                                filename = DateTime.Now.Date.ToString().Replace("/", "").Replace(":", "").Replace(" ", "") + "-" + Path.GetFileName(Request.Files[upload].FileName);
                                Request.Files[upload].SaveAs(Path.Combine(pathToSave, filename));
                            }

                            os.Anexo.PessoaCadastrou = usu;
                            os.Anexo.Caminho = "OS\\" + filename;
                        }
                        osADO.Salvar(os);
                    }
                    else
                    {
                        FuncionarioRepositorioADO funcADO = new FuncionarioRepositorioADO();
                        CREAPA.Dominio.Funcionario funcionario = new CREAPA.Dominio.Funcionario();
                        funcionario = funcADO.ListarPorLogin(User.Identity.Name);
                        
                        os.Setor = funcionario.Setor;
                        osADO.RegistrarAtendimento(os);
                        
                        if (os.PessoaCadastrou != os.PessoaInteressado)//Envia email de analise no registrar atendimento.
                            if (os.Analisada == false)
                                EnviarEmailOS(os, 1);
                            else
                                EnviarEmailOS(os, 2);
                    }
                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    ViewBag.GrupoProblema = GetGrupoProblemas;
                    ViewBag.Setor = new SelectList(db.Setors.Where(p => p.PermiteOS == true).OrderBy(p => p.Nome), "Id", "Nome");
                    ViewBag.PessoaInteressado = new SelectList(db.Funcionarios.Join(db.Pessoas,
                                  p => p.Pessoa.Id, c => c.Id,
                                  (p, c) => new { p.Login, c.Ativo }).Where(m => (m.Ativo == true)), "Login", "Login", User.Identity.Name);
                    ViewBag.OrigemOS = new SelectList(db.Origem_Os, "Id", "Descricao", 6);
                    TempData["notice"] = ex;
                    ModelState.AddModelError("", "Não foi possível gravar as alterações, tente novamente mais tarde, se o problema persistir, contate o administrador do sistema. \n<BR/>Erro: " + ex.Message);
                }
            }
            else
            {
                ViewBag.GrupoProblema = GetGrupoProblemas;
                //ViewBag.Problema = new SelectList(db.Problemas, "Id", "Descricao");
                ViewBag.Setor = new SelectList(db.Setors.Where(p => p.PermiteOS == true).OrderBy(p => p.Nome), "Id", "Nome");
                ViewBag.PessoaInteressado = new SelectList(db.Funcionarios.Join(db.Pessoas,
                                 p => p.Pessoa.Id, c => c.Id,
                                 (p, c) => new { p.Login, c.Ativo }).Where(m => (m.Ativo == true)), "Login", "Login", User.Identity.Name);
                ViewBag.OrigemOS = new SelectList(db.Origem_Os, "Id", "Descricao", 6);
            }
            return View(os);
        }

        [Authorize]
        public ActionResult ListaPendentes()
        {
            string usu = User.Identity.Name;
            FuncionarioRepositorioADO funcADO = new FuncionarioRepositorioADO();
            CREAPA.Dominio.Funcionario funcionario = new CREAPA.Dominio.Funcionario();
            funcionario = funcADO.ListarPorLogin(User.Identity.Name);
            int setor_id = Convert.ToInt32(funcionario.Setor);
            int qtde_os_pend_analise = db.OS.Where(p => p.Analisada == false && (p.Setor == setor_id || db.FuncionarioSetors.Any(e => e.Login == usu && p.Setor == e.Setor))).Count();
            ViewBag.TotalOS = qtde_os_pend_analise;

            var ListaDeOs = osADO.ListarOsPendAnalise(usu);
            return View(ListaDeOs);
        }

        [Authorize]
        public ActionResult RelatorioAnalise()
        {
            string usu = User.Identity.Name;
            CREAPA.Dominio.Relatorio relatorio = new CREAPA.Dominio.Relatorio();
            FuncionarioRepositorioADO funcADO = new FuncionarioRepositorioADO();
            CREAPA.Dominio.Funcionario funcionario = new CREAPA.Dominio.Funcionario();
            funcionario = funcADO.ListarPorLogin(User.Identity.Name);

            relatorio.Setor = funcionario.Setor;
            relatorio.Descricao = "FA";
            relatorio.Ano = DateTime.Now.Year;

            var ListaDeOs = relADO.ListarTotalOs(relatorio);
            return View(ListaDeOs);
        }

        [Authorize]
        public ActionResult RelatorioCadastro()
        {
            string usu = User.Identity.Name;
            CREAPA.Dominio.Relatorio relatorio = new CREAPA.Dominio.Relatorio();
            relatorio.PessoaCadastrou = usu;
            relatorio.Descricao = "P";
            relatorio.Ano = DateTime.Now.Year;

            var ListaDeOs = relADO.ListarTotalOs(relatorio);
            return View(ListaDeOs);
        }

        [Authorize]
        public ActionResult RelatorioProblema()
        {
            string usu = User.Identity.Name;
            CREAPA.Dominio.Relatorio relatorio = new CREAPA.Dominio.Relatorio();
            FuncionarioRepositorioADO funcADO = new FuncionarioRepositorioADO();
            CREAPA.Dominio.Funcionario funcionario = new CREAPA.Dominio.Funcionario();
            funcionario = funcADO.ListarPorLogin(User.Identity.Name);

            relatorio.Setor = funcionario.Setor;
            relatorio.Descricao = "P";
            relatorio.Ano = DateTime.Now.Year;

            var ListaDeOs = relADO.ListarTotalOs(relatorio);
            return View(ListaDeOs);
        }

        //Exibição sem o Topo
        [Authorize]
        public ActionResult ListaPendentes2()
        {
            string usu = User.Identity.Name;
            FuncionarioRepositorioADO funcADO = new FuncionarioRepositorioADO();
            CREAPA.Dominio.Funcionario funcionario = new CREAPA.Dominio.Funcionario();
            funcionario = funcADO.ListarPorLogin(User.Identity.Name);
            int setor_id = Convert.ToInt32(funcionario.Setor);
            int qtde_os_pend_analise = db.OS.Where(p => p.Analisada == false && (p.Setor == setor_id || db.FuncionarioSetors.Any(e => e.Login == usu && p.Setor == e.Setor))).Count();
            ViewBag.TotalOS = qtde_os_pend_analise;

            var ListaDeOs = osADO.ListarOsPendAnalise(usu);

            var ListaDeOsEst = relADO.ListarTotalOsEstatistica(DateTime.Now.Month.ToString(), DateTime.Now.Year.ToString(), setor_id.ToString());
            ViewBag.ListaDeOsEst = ListaDeOsEst;

            return View(ListaDeOs);

        }

        [Authorize]
        public ActionResult ListaTodasSetor()
        {
            {
                string usu = User.Identity.Name;

                var ListaDeOs = osADO.ListarTodasSetor(usu);
                return View(ListaDeOs);
            }
        }

        [Authorize]
        public ActionResult ListarTodas()
        {
            string usu = User.Identity.Name;
            var ListaDeOs = osADO.ListarPorFuncionario(usu);
            return View(ListaDeOs);
        }

        [Authorize]
        public ActionResult Erro()
        {
            return View();
        }

        [Authorize]
        public ActionResult Analisar(string Id)
        {
            if ((DateTime.Now.Hour > 7) && (DateTime.Now.Hour < 17))//Bloqueia Analisar OS fora do horário do expediente
            {
                var os = osADO.ListarPorId(Id);
                //ViewBag.GrupoProblema = GetGrupoProblemas;
                ViewBag.Setor = new SelectList(db.Setors, "Id", "Nome", os.Setor);
                ViewBag.PessoaInteressado = new SelectList(db.Funcionarios, "Login", "Login", os.PessoaInteressado);
                ViewBag.PessoaCadastrou = new SelectList(db.Funcionarios, "Login", "Login", os.PessoaCadastrou);
                ViewBag.Problema = new SelectList(db.Problemas.Where(p => p.Ativo == true).OrderBy(p => p.Descricao), "Id", "Descricao", os.Problema);

                //Retorna o histórico da Situação da Os
                var ListaDeOs = sitosADO.ListarPorIdDescricao(os.Id);
                ViewBag.ListaOS = ListaDeOs;
                //Retorna os anexos da Os (Se houver)
                var ListaDeAnexoOs = anexoADO.ListarPorId(os.Id);
                ViewBag.ListaDeAnexoOs = ListaDeAnexoOs;

                if (os == null)
                    return HttpNotFound();
                return View(os);
            }
            else
            {
                TempData["notice"] = "Não é possível Analisar OS fora do horario do expediente";
                return RedirectToAction("Erro");
            }

        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Analisar(OS os)
        {
            if (ModelState.IsValid)
            {
                os.PessoaCadastrou = User.Identity.Name;
                if (Request.Files["FileUpload1"].FileName != "")//Algum arquivo foi anexado
                {
                    foreach (string upload in Request.Files)
                    {
                        if (Request.Files[upload].ContentLength == 0) continue;
                        string pathToSave = Server.MapPath("~/Views/Documentos/OS/");
                        filename = DateTime.Now.Date.ToString().Replace("/", "").Replace(":", "").Replace(" ", "") + "-" + Path.GetFileName(Request.Files[upload].FileName);
                        Request.Files[upload].SaveAs(Path.Combine(pathToSave, filename));
                    }

                    os.Anexo.PessoaCadastrou = os.PessoaCadastrou;
                    os.Anexo.Caminho = "OS\\" + filename;
                }
                osADO.Analisar(os);
                EnviarEmailOS(os, 2);
                TempData["AnaliseOS"] = "OS Gravada com sucesso";
                return RedirectToAction("ListaPendentes");
            }
            else
            {
                //ViewBag.GrupoProblema = GetGrupoProblemas;
                ViewBag.Setor = new SelectList(db.Setors, "Id", "Nome", os.Setor);
                ViewBag.PessoaInteressado = new SelectList(db.Funcionarios, "Login", "Login", os.PessoaInteressado);
                ViewBag.PessoaCadastrou = new SelectList(db.Funcionarios, "Login", "Login", os.PessoaCadastrou);
                ViewBag.Problema = new SelectList(db.Problemas.Where(p => p.Ativo == true).OrderBy(p => p.Descricao), "Id", "Descricao", os.Problema);
                //Retorna o histórico da Situação da Os
                var ListaDeOs = sitosADO.ListarPorIdDescricao(os.Id);
                ViewBag.ListaOS = ListaDeOs;
                //Retorna os anexos da Os (Se houver)
                var ListaDeAnexoOs = anexoADO.ListarPorId(os.Id);
                ViewBag.ListaDeAnexoOs = ListaDeAnexoOs;
            }

            return View(os);
        }

        [Authorize]
        public ActionResult Reabrir(string Id)
        {
            if ((DateTime.Now.Hour > 7) && (DateTime.Now.Hour < 17))//Bloqueia Reabrir OS fora do horário do expediente
            {
                var os = osADO.ListarPorId(Id);

                if (os.Analisada == true)
                {
                    ViewBag.Setor = new SelectList(db.Setors, "Id", "Nome", os.Setor);
                    ViewBag.PessoaInteressado = new SelectList(db.Funcionarios, "Login", "Login", os.PessoaInteressado);
                    ViewBag.PessoaCadastrou = new SelectList(db.Funcionarios, "Login", "Login", os.PessoaCadastrou);
                    ViewBag.Problema = new SelectList(db.Problemas, "Id", "Descricao", os.Problema);
                    ViewBag.OrigemOS = new SelectList(db.Origem_Os, "Id", "Descricao");

                    //Retorna o histórico da Situação da Os
                    var ListaDeOs = sitosADO.ListarPorIdDescricao(os.Id);
                    ViewBag.ListaOS = ListaDeOs;
                    //Retorna os anexos da Os (Se houver)
                    var ListaDeAnexoOs = anexoADO.ListarPorId(os.Id);
                    ViewBag.ListaDeAnexoOs = ListaDeAnexoOs;

                    if (os == null)
                        return HttpNotFound();

                    return View(os);

                }
                else
                {
                    TempData["notice"] = "Não é possível Reabrir OS que não foi analisada";
                    return RedirectToAction("Erro");
                }
            }
            else
            {
                TempData["notice"] = "Não é possível Reabrir OS fora do horario do expediente";
                return RedirectToAction("Erro");
            }
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Reabrir(OS os)
        {
            if (ModelState.IsValid)
            {
                if (Request.Files["FileUpload1"].FileName != "")//Algum arquivo foi anexado
                {
                    foreach (string upload in Request.Files)
                    {
                        if (Request.Files[upload].ContentLength == 0) continue;
                        string pathToSave = Server.MapPath("~/Views/Documentos/OS/");
                        filename = DateTime.Now.Date.ToString().Replace("/", "").Replace(":", "").Replace(" ", "") + "-" + Path.GetFileName(Request.Files[upload].FileName);
                        Request.Files[upload].SaveAs(Path.Combine(pathToSave, filename));
                    }

                    string usu = User.Identity.Name;
                    os.Anexo.PessoaCadastrou = usu;
                    os.Anexo.Caminho = "OS\\" + filename;
                }

                osADO.Reabrir(os);
                return RedirectToAction("Index");
            }
            else
            {
                ViewBag.Setor = new SelectList(db.Setors, "Id", "Nome", os.Setor);
                ViewBag.PessoaInteressado = new SelectList(db.Funcionarios, "Login", "Login", os.PessoaInteressado);
                ViewBag.PessoaCadastrou = new SelectList(db.Funcionarios, "Login", "Login", os.PessoaCadastrou);
                ViewBag.Problema = new SelectList(db.Problemas, "Id", "Descricao", os.Problema);
                ViewBag.OrigemOS = new SelectList(db.Origem_Os, "Id", "Descricao");

                var ListaDeOs = sitosADO.ListarPorIdDescricao(os.Id);
                ViewBag.ListaOS = ListaDeOs;
            }

            return View(os);
        }

        [Authorize]
        public ActionResult Encerrar(string Id)
        {
            var os = osADO.ListarPorId(Id);

            if (os.Analisada == true)
            {
                ViewBag.Setor = new SelectList(db.Setors, "Id", "Nome", os.Setor);
                ViewBag.PessoaInteressado = new SelectList(db.Funcionarios, "Login", "Login", os.PessoaInteressado);
                ViewBag.PessoaCadastrou = new SelectList(db.Funcionarios, "Login", "Login", os.PessoaCadastrou);
                ViewBag.Problema = new SelectList(db.Problemas, "Id", "Descricao", os.Problema);
                ViewBag.OrigemOS = new SelectList(db.Origem_Os, "Id", "Descricao");
                var ListaDeAnexoOs = anexoADO.ListarPorId(os.Id);
                ViewBag.ListaDeAnexoOs = ListaDeAnexoOs;
                var ListaDeOs = sitosADO.ListarPorIdDescricao(os.Id);
                ViewBag.ListaOS = ListaDeOs;

                if (os == null)
                    return HttpNotFound();
                return View(os);
            }
            else
            {
                TempData["notice"] = "Não é possível Encerrar OS que não foi analisada";
                return RedirectToAction("Erro");
            }
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Encerrar(OS os)
        {
            if ((ModelState.IsValid) && (os.Avaliacao != null))
            {
                osADO.Encerrar(os);
                return RedirectToAction("Index");
            }
            else
            {
                ViewBag.Setor = new SelectList(db.Setors, "Id", "Nome", os.Setor);
                ViewBag.PessoaInteressado = new SelectList(db.Funcionarios, "Login", "Login", os.PessoaInteressado);
                ViewBag.PessoaCadastrou = new SelectList(db.Funcionarios, "Login", "Login", os.PessoaCadastrou);
                ViewBag.Problema = new SelectList(db.Problemas, "Id", "Descricao", os.Problema);
                ViewBag.OrigemOS = new SelectList(db.Origem_Os, "Id", "Descricao", os.OrigemOS);
                var ListaDeAnexoOs = anexoADO.ListarPorId(os.Id);
                ViewBag.ListaDeAnexoOs = ListaDeAnexoOs;
                var ListaDeOs = sitosADO.ListarPorIdDescricao(os.Id);
                ViewBag.ListaOS = ListaDeOs;

                if (os.Avaliacao == null)
                    ModelState.AddModelError("Avaliacao", "Selecione a Avaliacao");
            }

            return View(os);
        }

        [Authorize]
        public ActionResult Detalhes(string Id)
        {
            var os = osADO.ListarPorId(Id);

            ViewBag.Setor = new SelectList(db.Setors, "Id", "Nome", os.Setor);
            ViewBag.PessoaInteressado = new SelectList(db.Funcionarios, "Login", "Login", os.PessoaInteressado);
            ViewBag.PessoaCadastrou = new SelectList(db.Funcionarios, "Login", "Login", os.PessoaCadastrou);
            ViewBag.Problema = new SelectList(db.Problemas, "Id", "Descricao", os.Problema);
            ViewBag.OrigemOS = new SelectList(db.Origem_Os, "Id", "Descricao", os.OrigemOS);

            //Retorna o histórico da Situação da Os
            var ListaDeOs = sitosADO.ListarPorIdDescricao(os.Id);
            ViewBag.ListaOS = ListaDeOs;
            //Retorna os anexos da Os (Se houver)
            var ListaDeAnexoOs = anexoADO.ListarPorId(os.Id);
            ViewBag.ListaDeAnexoOs = ListaDeAnexoOs;

            if (os == null)

                return HttpNotFound();
            return View(os);

        }

        [Authorize]
        public ActionResult Excluir(string Id)
        {
            var os = osADO.ListarPorIdDescricao(Id);

            if (os == null)

                return HttpNotFound();
            return View(os);

        }
        [HttpPost, ActionName("Excluir")]
        [ValidateAntiForgeryToken]
        public ActionResult ExcluirConfirmado(string Id)
        {
            try
            {
                var os = osADO.ListarPorId(Id);
                osADO.Excluir(os);
                TempData["ExcluirOS"] = "OS Gravada com sucesso";
                return RedirectToAction("ListaPendentes");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", "Não foi possível gravar as alterações, tente novamente mais tarde, se o problema persistir, contate o administrador do sistema. <BR />Erro: " + ex.Message);
            }
            return View();
        }

        [Authorize]
        public ActionResult Download(string caminho)
        {
            string path = Server.MapPath("~/Views/Documentos/");

            path = path + caminho;

            byte[] fileBytes = System.IO.File.ReadAllBytes(path);
            string fileName = caminho.Substring(3, caminho.Length - 3);
            return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        private void EnviarEmailOS(OS os, int tipo)//tipo 1: cadastro - tipo 2: análise
        {
            //Instancia o objeto
            MailMessage Email = new MailMessage();

            //Atribui ao método From o valor do Remetente 
            Email.From = new MailAddress("<creapainformatica@gmail.com>", "CREA-PA");
            //Email.From = new MailAddress("<nti@creapa.com.br>", "NTI CREA-PA");

            //Define o formato da mensagem (pode ser texto)
            Email.IsBodyHtml = true;

            Email.BodyEncoding = System.Text.Encoding.GetEncoding("iso-8859-1");

            if (tipo == 1)//Cadastro da OS
            {
                SetorRepositorioADO setADO = new SetorRepositorioADO();
                CREAPA.Dominio.Setor setor = new CREAPA.Dominio.Setor();
                setor = setADO.ListarPorId(os.Setor);

                //Atribui ao método To o valor do Destinatário
                Email.To.Add(setor.Email);

                //Subject ou assunto da mensagem
                Email.Subject = "Solicitação de Ordem de Serviço gravada em " + DateTime.Now.ToString();

                //Atribui ao método corpo o texto da mensagem

                Email.Body = "<html><body><font style='font-family: Verdana; font-size: small'>Prezado(a) " +//+ objOS.Solicitante + "," +
                " <br /><br /> Informamos que foi gravada no sistema uma Ordem de Serviço com os seguintes dados:" +
                    //"<br />Assunto: " + os.Problema +
                "<br />Descrição: " + os.Descricao +
                "<br />Funcionário: " + os.PessoaInteressado +
                "<br /><br />Por favor, entre no SiSCREA e atenda a Ordem de Serviço o mais breve possível." +
                "<br /><br />Atenciosamente,<br /><br /><br />Núcleo de Tecnologia da Informação do CREA-PA.<br/><br/> " +
                "Telefone:(91)3219-1155/1156 </body></html>";
            }
            else if (tipo == 2)//Análise da OS
            {
                FuncionarioRepositorioADO funcADO = new FuncionarioRepositorioADO();
                CREAPA.Dominio.Funcionario funcionario = new CREAPA.Dominio.Funcionario();
                funcionario = funcADO.ListarPorLogin(os.PessoaInteressado);

                //Atribui ao método To o valor do Destinatário
                Email.To.Add(funcionario.Pessoa.Email);

                //Subject ou assunto da mensagem
                Email.Subject = "Análise de Ordem de Serviço gravada em " + DateTime.Now.ToString();

                //Atribui ao método corpo o texto da mensagem

                Email.Body = "<html><body><font style='font-family: Verdana; font-size: small'>Prezado(a) " + funcionario.Pessoa.Nome + "," +
           " <br /><br /> Informamos que sua Ordem de Serviço referente a solicitação \"" + os.Descricao +
           "\" foi finalizada pelo(a) funcionário(a): " + os.PessoaCadastrou + "." +
           " <br />Descrição da solução do problema: \"" + os.DescricaoAnalise + "\"" +
           "<br /><br />Por favor, entre no SiSCREA e encerre sua Ordem de Serviço." +
           "<br /><br />Caso seu problema ainda não tenha sido resolvido, entre novamente em contato com o setor responsável." +
           "<br /><br />Esta é uma mensagem enviada automaticamente pelo SiSCREA." +
           "<br /><br />Atenciosamente,<br /><br /><br />Núcleo de Tecnologia da Informação do CREA-PA.<br/><br/> " +
           "Telefone:((91)3219-1155/1156 </body></html>";
            }

            //Define a prioridade do Email como Alta
            Email.Priority = MailPriority.High;

            //cria objeto com os dados do SMTP 
            SmtpClient smtp = new SmtpClient();

            //Define o host do SMTP 
            smtp.Host = "smtp.gmail.com";
            //smtp.Host = "192.168.0.3";
            smtp.Port = 587;
            smtp.UseDefaultCredentials = false;
            smtp.Credentials = new System.Net.NetworkCredential
            ("creapainformatica@gmail.com", "ReS@3)41934");// Enter seders User name and password
            smtp.EnableSsl = true;

            try
            {
                //envia o e-mail através do método .send() 
                smtp.Send(Email);
            }
            catch (Exception erro)
            {
                //Envia a mensagem de erro

            }
            //Exclui o objeto de e-mail da memória 
            Email.Dispose();

        }
    }
}






